﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Configuration;
using WLMCoreLibrary;
using System.Reflection;
using SAW_Core;

namespace SAWPOS
{



    public partial class frmAltaProducto : Form
    {
        public event EventHandler ProductSelected;
        public event EventHandler ProductAdded;

        #region private fields
        private DataTable datosTabla;
        private Producto productoSeleccionado;
        private Boolean nuevoProd=false;
        private Boolean nuevoCodigoBarras=false;
        #endregion

        #region constructors
        public frmAltaProducto()
        {
            InitializeComponent();
            LoadGridData();
            CleanForm();
        }

        public frmAltaProducto(string claveProducto)
        {
            InitializeComponent();
            LoadGridData();
            CleanForm();
            txtClaveProducto.Text = claveProducto;
            txtDescripcion.Focus();
            nuevoCodigoBarras = true;
            MessageBox.Show("Ingrese los datos del nuevo producto");
        }
        #endregion

        #region Form Events
        private void frmAltaProducto_Load(object sender, EventArgs e)
        {

        }

        private void label4_Click(object sender, EventArgs e)
        {

        }

        private void textBox5_TextChanged(object sender, EventArgs e)
        {

        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            GuardarProducto();
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            ChangeSearchFilter();
        }

        private void gridStock_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            int idRowRegistro=e.RowIndex;
            ShowProduct(idRowRegistro);
        }


        #endregion

        #region Private Methods
        private void CleanForm()
        {
            txtClaveProducto.Text = "";
            txtDescripcion.Text = "";
            txtPrecio.Text = "$0.00";
            txtStock.Text = "0";
            txtUnidadMedida.Text = "Pza."; 
        }

        private void GuardarProducto()
        {
            dbConnector conexion = new dbConnector(ConfigurationSettings.AppSettings["cadenaConexion"].ToString());
            try
            {
                Producto productoGenerado;
                if (productoSeleccionado != null)
                    productoSeleccionado = new Producto(productoSeleccionado.id, ref conexion);
                else
                {
                    productoSeleccionado = new Producto(ref conexion);
                    nuevoProd = true;
                }
                productoSeleccionado.Clave = txtClaveProducto.Text;
                productoSeleccionado.Descripcion = txtDescripcion.Text;
                productoSeleccionado.Modelo = modelo.Text;
                productoSeleccionado.Precio1 = WLMFunctions.MonedaADecimal(txtPrecio.Text);
                productoSeleccionado.UnidadMedida = txtUnidadMedida.Text;
                productoSeleccionado.Stock = Convert.ToDecimal(txtStock.Text);
                productoSeleccionado.Save();
                productoGenerado = productoSeleccionado;
                productoSeleccionado = null;
                conexion.CloseConnection();
                CleanForm();
                if(nuevoCodigoBarras&&nuevoProd)
                    ProductAdded(productoGenerado,new EventArgs());
            }
            catch {
                if(conexion.connector.State==ConnectionState.Open)
                    conexion.CloseConnection(); 
            }
            LoadGridData();
        }

        /// <summary>
        /// Loads the grid data.
        /// </summary>
        /// 
        private void LoadGridData()
        {
            dbConnector conexion = new dbConnector(ConfigurationSettings.AppSettings["cadenaConexion"].ToString());
            try
            {
                ProductoCollection lista= new ProductoCollection(ref conexion);

                gridStock.AutoGenerateColumns = false;
                datosTabla = ListToDataTable(lista.Elementos);
                //          
                gridStock.DataSource = datosTabla.DefaultView;
            }
            catch (Exception ex)
            {
            }
            conexion.CloseConnection();
        }

        private void SaveProductData()
        {
            dbConnector conexion = new dbConnector(ConfigurationSettings.AppSettings["cadenaConexion"].ToString());
            try
            {
            }
            catch (Exception ex)
            {
            }
            conexion.CloseConnection();
        }

        private void ChangeSearchFilter()
        {
            try
            {
                string valorBusqueda=txtBuscar.Text;
                DateTime fechaBusqueda=DateTime.Now;
                datosTabla.DefaultView.RowFilter = "Descripcion LIKE '%" + valorBusqueda + "%' OR Clave LIKE '%" + valorBusqueda + "%' OR Modelo LIKE '%" + valorBusqueda + "%'";
                if (valorBusqueda.Length == 0)
                    datosTabla.DefaultView.RowFilter = "";
            }
            catch
            { }
        }

        private void ShowProduct(int idRowRegistro)
        {
            dbConnector conexion = new dbConnector(ConfigurationSettings.AppSettings["cadenaConexion"].ToString());
            try
            {
                int idRegistro=Convert.ToInt32(gridStock.Rows[idRowRegistro].Cells["id"].Value);
                productoSeleccionado = new Producto(idRegistro, ref conexion);
                conexion.CloseConnection();
                txtClaveProducto.Text = productoSeleccionado.Clave;
                txtDescripcion.Text = productoSeleccionado.Descripcion;
                txtPrecio.Text = productoSeleccionado.Precio1.ToString("C");
                txtStock.Text = productoSeleccionado.Stock.ToString();
                txtUnidadMedida.Text = productoSeleccionado.UnidadMedida;


            }
            catch (Exception ex)
            {
                if(conexion.connector.State==ConnectionState.Open)
                conexion.CloseConnection();
            }
        }

        private void SelectActualProduct()
        {
            try
            {
                dbConnector conexion = new dbConnector(ConfigurationSettings.AppSettings["cadenaConexion"].ToString());
                Producto prodSel=new Producto(productoSeleccionado.id, ref conexion);
                conexion.CloseConnection();
                ProductSelected(prodSel, new EventArgs());
            }
            catch
            {
            }
        }

        private DataTable ListToDataTable<T>(List<T> list)
        {
            DataTable dt = new DataTable();

            foreach (PropertyInfo info in typeof(T).GetProperties())
            {
                dt.Columns.Add(new DataColumn(info.Name, info.PropertyType));
            }
            foreach (T t in list)
            {
                DataRow row = dt.NewRow();
                foreach (PropertyInfo info in typeof(T).GetProperties())
                {
                    row[info.Name] = info.GetValue(t, null);
                }
                dt.Rows.Add(row);
            }
            return dt;
        } 
        #endregion

        private void btnSeleccionar_Click(object sender, EventArgs e)
        {
            SelectActualProduct();
        }

        private void txtBuscar_TextChanged(object sender, EventArgs e)
        {
            ChangeSearchFilter();
        }

        
    }
}
